{
    //关于proxy
    //创建类似供应商的对象(原始的对象)
    let obj = {
        time: "2017-03-11",
        name: 'net',
        _r: 123
    };

    let monitor = new Proxy(obj, {
        //拦截Object.keys(),Object.getOwnPropertySymbols()
        //Object.getOwnPropertyNames()
        ownKeys(target) {
            return Object.keys(target).filter(i => i !== 'time');
        }
    });
    //console.log(Object.keys(monitor));

}


{
    let obj = {
        time: "2017-03-11",
        name: 'net',
        _r: 123
    };
    let pro = new Proxy(obj, {
        set(target, property, value, receiver) {
            return true;
        }

    });
}

{
    //关于Reflect
    let obj = {
        time: "2017-03-11",
        name: 'net',
        _r: 123
    };
    //使用Reflect读取一个对象
    //console.log(Reflect.get(obj,"time"))

}



{
    //使用Proxy进行数据的校验
    //首先,我们创建一个函数进行数据的校验
    //validator
    function validator(target, validator) {

        //这个函数返回一个Proxy实例,代理了新生成的实例
        //当对这个代理实例进行操作的时候,就会触发下面的操作
        return new Proxy(target, {
            _validator: validator,
            set(target, key, value, receiver) {
                //我们来判断当前的目标对象有没有key值
                if (target.hasOwnProperty(key)) {
                    let va = this._validator[key];
                    if (!!va(value)) {
                        return Reflect.set(target, key, value, receiver);
                    } else {
                        throw Error(`不能设置${key}到${value}`);
                    }

                } else {
                    throw Error(`${key} 不存在`);
                }
            }
        })
    }

    //把校验的方法给抽象出来了.
    //如果说,我以后想要验证一个新的值的话,只需要在这里添加就可以了
    //这样就比较方便了,维护代码的话,就比较方便了.
    const personValidators = {
        name(val) {
            return typeof val === "string";
        },
        age(val) {
            return typeof val === 'number' && val > 18
        }
    };

    //定义一个构造函数
    class Person {
        constructor(name,age){
            this.name=name;
            this.age=age;
            //这里用到了构造函数的一个知识点
            //那就是构造函数返回的东西,可以覆盖new的东西
            //这个时候return的就是代理过后的实例
            //你在外面操作的,并不是真正的Person生成的实例,而是经过代理以后的实例
            return validator(this,personValidators);
        }
    }

    const person=new Person('lilei',30);
    console.log(person);
    console(person.age=10);
}



























































































